package pe.com.hermes.hermetic.web.controller.reportes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ConsolidadoBean;
import pe.com.hermes.hermetic.beans.DetallePedidoBean;
import pe.com.hermes.hermetic.beans.PedidosBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.controller.general.MostrarReporteController;
import pe.com.hermes.hermetic.web.forms.HMF3003Form;
import pe.com.hermes.hermetic.web.forms.HMF3005Form;
import pe.com.hermes.hermetic.web.forms.HMF4002Form;
import pe.com.hermes.hermetic.web.forms.HMF4010Form;
import pe.com.hermes.hermetic.web.forms.HMF4016Form;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

@SessionAttributes(value={"listadoUnidMone","listaCuentas","codOpci","desOpci"})
@Controller
@RequestMapping("/mostrarHWF4002.html")
public class SaldoDiaController implements IController{
    protected final static Logger logger = Logger.getLogger(SaldoDiaController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    
    @Autowired
    private MostrarReporteController reporteFactory;      
    
    @RequestMapping(method=RequestMethod.GET)        
    protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_SALDOS_POR_DIA)) {
            return FORM_ACCESS_NULL_VIEW;
        }

        HMF4002Form form = new HMF4002Form();
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");

        try {
            List listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                model.put("listaCuentas", listadoCuentas);
            
                //Por defecto esta marcado TODOS las cuentas            
                String[] chksCuenta = Util.listToStringArray(listadoCuentas);     
                //request.getSession(false).setAttribute("chksCuenta",chksCuenta);
                String codCuentas = Util.arrayToString(chksCuenta,",");                
                
                //Agregar el codigo de cuenta de la pagina
                List listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, "1");
                if (listadoUnidMone != null) {
                    model.put("listadoUnidMone", listadoUnidMone);
                }
            }
            AuditBean auditBean = new AuditBean(SALD_DIA);
            servicioHermetic.inseAudit(auditBean);
            String fecha = servicioHermetic.getFechaHoy();
            form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
            form.setFechadesde(fecha);
            form.setFechahasta(fecha);
            form.setCliente(cliente);
            form.setSucursal(sucursal);
            form.setCuenta("");
            form.setFormulario("HMR4002");
            session.setAttribute("chksCuenta",null);
            session.setAttribute("chksSucu",null);
            session.setAttribute("chksModulo",null);                  
            session.removeAttribute("tipoUnidMone");   
            String codOpci = IWebOpciones.SALD_DIA;
            String desOpci = servicioHermetic.getDesOpci(codOpci, request);
            model.put("codOpci",codOpci);
            model.put("desOpci",desOpci);
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Error en el proceso. "+ e);
            return FORM_ERROR_VIEW;
        }        

        return FORM_SALDOS_DIA_VIEW;
    }
    @RequestMapping(params="accion=cargarModulo")
    private String cargarModulo (ModelMap model,@ModelAttribute(FORM_KEY) HMF4002Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_SALDOS_POR_DIA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        
        String cuenta = form.getCuenta();
        form.setCuenta(form.getCuenta());

        try {
            List listaModulos = servicioHermetic.getBovedaCuenta(sucursal, cliente, cuenta);
            if (listaModulos != null) {
                model.put("listaModulo", listaModulos);
            }
            List listadoCuentas = 
                servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                model.put("listaCuentas", listadoCuentas);
            }
          


            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_SALDOS_DIA_VIEW;
    }
    
    
    @RequestMapping(params="accion=cargarFecha")
    private String cargarFecha (ModelMap model,@ModelAttribute(FORM_KEY) HMF4002Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_SALDOS_POR_DIA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        
        String cuenta = form.getCuenta();
        String boveda = form.getModulo();
        
        try {
            //int unidad =    servicioHermetic.getTipoUnidadMonetaria(sucursal , cliente,cuenta,boveda);
            //if (unidad != 999) {
            //    FechaCuentaBean fcbean = servicioHermetic.getFechaCuenta(sucursal ,cliente,  cuenta, boveda);
            //     form.setFechadesde(fcbean.getFecha());
            //    form.setFechahasta(fcbean.getFechai());
            //  }
            form.setFechadesde(form.getFechadesde());
            form.setCuenta(form.getCuenta());
            List listaModulos = 
                servicioHermetic.getBovedaCuenta(sucursal, cliente, 
                                                       cuenta);
            if (listaModulos != null) {
                model.put("listaModulo", listaModulos);
            }
            List listadoCuentas = 
                servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                model.put("listaCuentas", listadoCuentas);
            }
      
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_SALDOS_DIA_VIEW;
    }    
    
    @RequestMapping(params="accion=mostrarReporte")
    private void mostrarReporte (ModelMap model,@ModelAttribute(FORM_KEY) HMF4002Form form, HttpServletRequest request, HttpServletResponse response) throws Exception {        

        List listCuentas = new ArrayList(); 
        List listModulos = new ArrayList(); 
        
        /************** Valores por defecto elegidos para Cuenta y Modulo *************/
        // Cuentas
         String[] chksCuenta = null;
        if (form.getCuenta()!=null && form.getCuenta().equals(ConstantesHermetic.CTE_REP_CUENTA_TODOS)){
            //TODOS las cuentas
            listCuentas = servicioHermetic.getCuentas(form.getSucursal(), form.getCliente());  
            chksCuenta = Util.listToStringArray(listCuentas);            
            request.getSession(false).setAttribute("chksCuenta",chksCuenta);                 
        }else{
            //ALGUNAS cuentas
            chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
            request.getSession(false).setAttribute("chksCuenta",chksCuenta);
        }
        
        // Modulos por Unidad Monetaria y Cuentas            
        if (chksCuenta!=null && chksCuenta.length > 0 &&
            form.getTipoUnidMone()!=null && !form.getTipoUnidMone().equals(ConstantesHermetic.CTE_REP_UNID_MONE_BLANCO)){            

            String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");
            String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");        
            String tipoUnidMone = request.getParameter("tipoUnidMone");
            if((tipoUnidMone!=null && !tipoUnidMone.equals(tipoUnidMoneSession))){
                String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                chksModulo = Util.listToStringArray(listModulos);            
                request.getSession(false).setAttribute("chksModulo",chksModulo);
            }  
            if(Util.contDatosSession(chksModulo) < 1){
                model.put("message","Seleccione al menos una boveda");                
            }
            /*
            if (Util.contDatosSession(chksModulo) > 0){
                //Total en session mayor a CERO
                request.getSession(false).setAttribute("chksModulo",chksModulo);                
            }else{
                //obtengo todos los modulos del tipo de unidad monetaria
                 String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                 listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                 //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                 chksModulo = Util.listToStringArray(listModulos);            
                 request.getSession(false).setAttribute("chksModulo",chksModulo);                   
            }            
            */
        }        
        /************** Valores por defecto elegidos para Cuenta y Modulo - Fin *************/            
        
        //Obtiene el listado de Unidad de Moneda        
        String codClie=(String)request.getSession(false).getAttribute("cliente");
        reporteFactory.mostraReporte(request,response,codClie);     
        
    }    
    
    @RequestMapping(params="accion=verExcel")
    private String verExcel (ModelMap model,@ModelAttribute(FORM_KEY) HMF4002Form form, HttpServletRequest request, HttpServletResponse response) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_SALDOS_POR_DIA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        
        List listCuentas = new ArrayList(); 
        List listModulos = new ArrayList(); 
        
            try {

            /************** Valores por defecto elegidos para Cuenta y Modulo *************/
            // Cuentas
             String[] chksCuenta = null;
            if (form.getCuenta()!=null && form.getCuenta().equals(ConstantesHermetic.CTE_REP_CUENTA_TODOS)){
                //TODOS las cuentas
                listCuentas = servicioHermetic.getCuentas(form.getSucursal(), form.getCliente());  
                chksCuenta = Util.listToStringArray(listCuentas);            
                request.getSession(false).setAttribute("chksCuenta",chksCuenta);                 
            }else{
                //ALGUNAS cuentas
                chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                request.getSession(false).setAttribute("chksCuenta",chksCuenta);
            }
            
            // Modulos por Unidad Monetaria y Cuentas            
            if (chksCuenta!=null && chksCuenta.length > 0 &&
                form.getTipoUnidMone()!=null && !form.getTipoUnidMone().equals(ConstantesHermetic.CTE_REP_UNID_MONE_BLANCO)){            
    
                String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");
                String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");        
                String tipoUnidMone = request.getParameter("tipoUnidMone");
                if((tipoUnidMone!=null && !tipoUnidMone.equals(tipoUnidMoneSession))){
                    String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                    listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                    //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                    chksModulo = Util.listToStringArray(listModulos);            
                    request.getSession(false).setAttribute("chksModulo",chksModulo);
                }  
                if(Util.contDatosSession(chksModulo) < 1){
                    model.put("message","Seleccione al menos una boveda");                
                }
                /*
                if (Util.contDatosSession(chksModulo) > 0){
                    //Total en session mayor a CERO
                    request.getSession(false).setAttribute("chksModulo",chksModulo);                
                }else{
                    //obtengo todos los modulos del tipo de unidad monetaria
                     String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                     listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                     //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                     chksModulo = Util.listToStringArray(listModulos);            
                     request.getSession(false).setAttribute("chksModulo",chksModulo);                   
                }            
    */
            }        
            /************** Valores por defecto elegidos para Cuenta y Modulo - Fin *************/             
            
            String codCuentas = Util.arrayToString((String[])session.getAttribute("chksCuenta"),",");
            String codModulos = Util.arrayToString((String[])session.getAttribute("chksModulo"),",");       
        
            List listDescCnta = servicioHermetic.getDescCuentaMulti(sucursal, cliente, codCuentas);
            List listDescBove = servicioHermetic.getDescModuloMulti(sucursal, cliente, codModulos);        
            String descCnta = Util.listToString(listDescCnta," / ");
            String descBove = Util.listToString(listDescBove," / ");        
        
            List listadoCuentas = 
                servicioHermetic.getCuentas(form.getSucursal(), 
                                                  form.getCliente());
            List listaModulos = 
                servicioHermetic.getBovedaCuenta(form.getSucursal(),
                                                       form.getCliente(), 
                                                       form.getCuenta());                                                  
            List listaSaldos = servicioHermetic.getSaldosPorDia(form.getCliente(),
                                                                form.getSucursal(),
                                                                codCuentas,
                                                                codModulos,
                                                                form.getFechadesde(),
                                                                form.getFechahasta());
            model.put("descCnta",descCnta);
            model.put("descBove",descBove);
            model.put("listadoCuentas",listadoCuentas);
            model.put("listaModulos",listaModulos);
            model.put("listaSaldos",listaSaldos);

            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }
        response.addHeader("Content-type", "application/vnd.ms-excel");
        response.addHeader("Content-Disposition", "attachment; filename=saldodia.xls");
        response.setContentType("Content-type: application/vnd.ms-excel");
        
        response.setHeader("Cache-Control","cache"); // HTTP 1.1
        response.setHeader("Pragma","cache"); // HTTP 1.0
        response.setDateHeader ("Expires", -1);  
        return FORM_SALDOS_DIA_EXCEL;
    }        
}
